package phototour3.client;



import java.util.LinkedList;
import java.util.List;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.RequestBuilder;
import com.google.gwt.http.client.RequestCallback;
import com.google.gwt.http.client.RequestException;
import com.google.gwt.http.client.Response;
import com.google.gwt.http.client.URL;
import com.google.gwt.json.client.JSONArray;
import com.google.gwt.json.client.JSONException;
import com.google.gwt.json.client.JSONNumber;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONParser;
import com.google.gwt.json.client.JSONString;
import com.google.gwt.json.client.JSONValue;
import com.google.gwt.maps.client.InfoWindowContent;
import com.google.gwt.maps.client.MapWidget;
import com.google.gwt.maps.client.InfoWindowContent.InfoWindowTab;
import com.google.gwt.maps.client.control.LargeMapControl;
import com.google.gwt.maps.client.control.MapTypeControl;
import com.google.gwt.maps.client.event.MarkerClickHandler;
import com.google.gwt.maps.client.geom.LatLng;
import com.google.gwt.maps.client.overlay.Icon;
import com.google.gwt.maps.client.overlay.Marker;
import com.google.gwt.maps.client.overlay.MarkerOptions;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.VerticalPanel;

public class Phototour3 implements EntryPoint {
	

	private Label algorithmsLabel=new Label("Algorithm type: ");
	private Label distanceLabel=new Label("Radius of the area: ");
	private Label numberOfPhotosLabel=new Label("Number of photos: ");
	private Label minimumNumberOfPhotos = new Label("Minimum number of photos per area: ");
	private Label maximunNumberOfAreas = new Label("Maximun number of areas to represent: ");

	private ListBox algorithms=new ListBox();
	private Button submit = new Button("Search");
	private Button reload = new Button("Clean");
	private ListBox numberOfPhotos=new ListBox();
	private ListBox distanceAlgorithm=new ListBox();
	private ListBox minimunPhotos= new ListBox();
	private ListBox maximunAreas= new ListBox();
	
	//TextsArea
	private TextArea numberOfPhotosT=new TextArea();
	private TextArea distanceAlgorithmT=new TextArea();
	private TextArea minimunPhotosT=new TextArea();
	private TextArea maximunAreasT=new TextArea();

	private HorizontalPanel mainPanel = new HorizontalPanel();
	private VerticalPanel photoPanel= new VerticalPanel();
	private VerticalPanel vPanel = new VerticalPanel();
	private VerticalPanel vPanel2 = new VerticalPanel();
//	private Integer numberOfPoints;	//lo necesito para ir rellenando los puntos a unir TODO
	private LatLng[] mapsPoints=new LatLng[102];
	private HorizontalPanel areaAndImage=new HorizontalPanel();

	private HorizontalPanel algorithmPanel = new HorizontalPanel();
	private HorizontalPanel distancePanel = new HorizontalPanel();
	private HorizontalPanel numberOfPhotosPanel=new HorizontalPanel();
	private HorizontalPanel minimumPhotosPanel=new HorizontalPanel();
	private HorizontalPanel maximunAreasPanel=new HorizontalPanel();
	
	private boolean radiusDown= false;
	private boolean minDown= false;
	private boolean maxDown= false;
	
	

	private static String checkControl="";
	private DialogBox db= new DialogBox();

	private MapWidget map;
	
	private Algorithm algorithm;
	
	public static void setCheckControl(String s){
		checkControl+=s;
	}
	
	public void onModuleLoad() {
		
		photoPanel.setStyleName("photo-panel");
		mainPanel.setStyleName("main-panel");
		
		algorithmPanel.setStyleName("list-panel");
		distancePanel.setStyleName("list-panel");
		numberOfPhotosPanel.setStyleName("list-panel");
		minimumPhotosPanel.setStyleName("list-panel");
		maximunAreasPanel.setStyleName("list-panel");
		
		algorithmsLabel.setStyleName("label-panel");
		distanceLabel.setStyleName("label-panel");
		numberOfPhotosLabel.setStyleName("label-panel");
		minimumNumberOfPhotos.setStyleName("label-panel");
		maximunNumberOfAreas.setStyleName("label-panel");

		vPanel2.setStyleName("options-panel");
		vPanel.setStyleName("buttons-panel");
		
		radiusDown= false;
		minDown= false;
		maxDown= false;

		submit.addClickHandler(new ClickHandlerImpl1());
		reload.addClickHandler((new ClickHandlerImpl2()));
		distanceAlgorithm.addClickHandler(new ClickHandlerImpl3());
		minimunPhotos.addClickHandler(new ClickHandlerImpl4());
		maximunAreas.addClickHandler(new ClickHandlerImpl5());
		

	    fillAlgorithms();
		fillNumberOfPhotos();
		
		LatLng mapCenter = LatLng.newInstance( 37.384439,  -5.945917);
	    // Open a map centered on Cawker City, KS USA
		
		map = new MapWidget(mapCenter, 11);
//	    map.setSize("500px", "650px");
	    map.setSize("800px", "450px");
	    map.setStyleName("map");
	    	    

	    // Add some controls for the zoom level
	    map.addControl(new LargeMapControl());
	    
	    //Add satellite control to assess the results
	    //http://gwt-google-apis.googlecode.com/svn/javadoc/maps/1.0/com/google/gwt/maps/client/control/Control.html
	    //http://gwt-google-apis.googlecode.com/svn/javadoc/maps/1.0/com/google/gwt/maps/client/control/MapTypeControl.html
	    map.addControl(new MapTypeControl());
	    
	    // Add a marker
	    map.addOverlay(new Marker(mapCenter));

	    // Add an info window to highlight a point of interest
//	    map.getInfoWindow().open(map.getCenter(), 
//	        new InfoWindowContent("¡¡This is my city!!"));
	    
	    //Habilita el uso del zoom con el scroll
	    map.setScrollWheelZoomEnabled(true);
	    
//	    RootPanel.get("photos").add(photoPanel);
//	    RootPanel.get("options").add(mainPanel);
	    // Add the map to the HTML host page
	    RootPanel.get("map").add(map);
		
//		RootPanel.get("options").add(vPanel2);

		
		algorithmPanel.add(algorithmsLabel);
		algorithmPanel.add(algorithms);
		
		numberOfPhotosPanel.add(numberOfPhotosLabel);
		numberOfPhotosPanel.add(numberOfPhotos);
		numberOfPhotosT.setSize("5em","1em");
		numberOfPhotosPanel.add(numberOfPhotosT);
		
		distancePanel.add(distanceLabel);
		distancePanel.add(distanceAlgorithm);
		distanceAlgorithmT.setSize("5em","1em");
		distancePanel.add(distanceAlgorithmT);
		
		minimumPhotosPanel.add(minimumNumberOfPhotos);
		minimumPhotosPanel.add(minimunPhotos);
		minimunPhotosT.setSize("5em","1em");
		minimumPhotosPanel.add(minimunPhotosT);
		
		maximunAreasPanel.add(maximunNumberOfAreas);
		maximunAreasPanel.add(maximunAreas);
		maximunAreasT.setSize("5em","1em");
		maximunAreasPanel.add(maximunAreasT);
	    
		submit.setStyleName("buttons");
		reload.setStyleName("buttons");
		vPanel.add(submit);
		vPanel.add(reload);
		vPanel2.add(algorithmPanel);
		vPanel2.add(distancePanel);
		vPanel2.add(numberOfPhotosPanel);
		vPanel2.add(minimumPhotosPanel);
		vPanel2.add(maximunAreasPanel);
		mainPanel.add(vPanel2);
		mainPanel.add(vPanel);
		
		

		// Associate the main panel with HTML
		
		RootPanel.get("phototour").add(mainPanel);
		
	}
	
	/*Controla el máximo de áreas a representar*/
	//lo que hace es mirar si ya se ha rellenado el listBox de la interfaz
	//en caso de que maxDown sea true quiere decir que ya se ha hecho una vez
	//click y no se tiene que cargar otra vez la información
	private class ClickHandlerImpl5 implements ClickHandler {
		public void onClick(ClickEvent event) {
			if(!maxDown){	
				maximunAreas.clear();
				fillMaxAreas();
				maxDown=true;
			}
		}
	}
	
	/*Vamos a controlar que según el radio seleccionado el límite sea uno u otro,
	 * de momento lo ponemos como un ListBox, pero cuando pongamos la web REAL hemos de
	 * ponerlo como un TextBox*/
	private class ClickHandlerImpl4 implements ClickHandler {
		public void onClick(ClickEvent event) {
			if(!minDown){
				minimunPhotos.clear();
				fillMinPhotosPerArea();
				minDown=true;
			}
		}
	}
	
	/*Controlará el RADIO con respecto al zoom, pero solo para las pruebas, para la hora
	 * de poner en funcionamiento REAL la aplicación será un TextBox para que se pueda
	 * escoger cualquier valor del rango, e incluso que no pertenezca al rango óptimo*/
	private class ClickHandlerImpl3 implements ClickHandler {
		public void onClick(ClickEvent event) {
			if(!radiusDown){
				distanceAlgorithm.clear();
				fillRadius();
				radiusDown=true;
			}
			
			
		}
	}

	
	private class ClickHandlerImpl2 implements ClickHandler {
		public void onClick(ClickEvent event) {
//			distanceAlgorithm.setText("");
			
			//MIENTRAS INVESSTIGO SEVILLA
//			map.setZoomLevel(13);
//			map.setCenter(LatLng.newInstance(37.380661,-5.980385));
		
			
			
			photoPanel.clear();
			photoPanel.removeFromParent();
			//TENER EN CUENTA QUE EL PANEL NO SE VA A DEJAR EN LA IMPLEMENTACIÓN A ENTREGAR
			db.clear();
			
			algorithms.clear();
			fillAlgorithms();
			
			//Provisionales mientras persistan los ListBox
			numberOfPhotos.clear();
			distanceAlgorithm.clear();
			minimunPhotos.clear();
			maximunAreas.clear();
			
			fillNumberOfPhotos();
			fillRadius();
			fillMinPhotosPerArea();
			fillMaxAreas();
			
			db.removeFromParent();
//			db.setVisible(false);
			//ésta línea de código la pongo para que cuando el usuario vuelva a pulsar buscar
			//sin recargar la pág le salga el mapa sin los marcadores de su anterior busqueda
			map.clearOverlays();
		}
	}


	private class ClickHandlerImpl1 implements ClickHandler {

		
		public void onClick(ClickEvent event) {
//			System.out.println("El método getValue() devuelve: "+distanceAlgorithm.getItemText(distanceAlgorithm.getSelectedIndex()));
//			System.out.println("Cambio el valor de ");
//			System.out.println("El método getText() devuelve: "+distanceAlgorithm.getItemText(distanceAlgorithm.getSelectedIndex()));
			
			Integer numberOfPh=selectedNumberOfPhotos();
			System.out.println("Se han solicitado: "+numberOfPh+" fotos. ");
			
//			numberOfPoints=0;
			

			Double latitudMax=map.getBounds().getNorthEast().getLatitude();
		    Double longitudMax=map.getBounds().getNorthEast().getLongitude();
		    Double latitudMin=map.getBounds().getSouthWest().getLatitude();
		    Double longitudMin=map.getBounds().getSouthWest().getLongitude();
		    
		    //If phototour is running on appEngine the url is:
			// "http://nombre del proyecto en el servidor/clase del servidor
		    //in this case:
		    
//			String url="http://phototour-advanced.appspot.com/PhotoRequest?lat1="	
//			+ latitudMin + "&lat2=" + latitudMax
//			+ "&long1=" + longitudMin + "&long2="	
//			+ longitudMax+"&p=panoramio"+"&numberOfPhotos="+numberOfPh;
//			Window.alert("Hemos contruido la url: "+url);
		    
		  //If phototour is running on the local server, the url is:
			String url = "http://127.0.0.1:8888/PhotoRequest?lat1="	
						+ latitudMin + "&lat2=" + latitudMax
						+ "&long1=" + longitudMin + "&long2="	
						+ longitudMax+"&p=panoramio"+"&numberOfPhotos="+numberOfPh;
//				
			//añado un panel de dialogo para la url
			checkControl=url;
//			db.setVisible(true);
			
			//Adiero al panel root el dialog panel, ahora si me interesa que aparezca
			db.setText(checkControl);
			db.setTitle("funcionamiento del código y procesado");
			db.setWidth("70em");
//			RootPanel.get("dialogPanel").add(db); TODO :Aquí se asocia el dialog box al panel principal
			
			DialogBox d1=new DialogBox();
			d1.setWidth("70em");
			d1.setText(checkControl);
			db.add(d1);
			
			//System.out.println("El zoom de este sector es: "+map.getZoomLevel());
			RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, URL
					.encode(url));

			try {
				@SuppressWarnings("unused")
				Request r= builder.sendRequest(null,
						new RequestCallback() {
							public void onError(Request request,
									Throwable exception) {
								// Couldn't connect to server (could be timeout,
								// SOP violation, etc.)
							
							}

							public void onResponseReceived(Request request,
									Response response) {
								if (200 == response.getStatusCode()) {
									// Process the response in response.getText()
									
									checkControl+="photo request ok";
									db.setText(checkControl);
									checkControl+=response.getText();
									// Method to process JSON
									//IMPORTANTEEE!!LLEGA AQUI ANTES DE RELLENAR LA FOTO ASI QUE NO HACE BIEN LO QUE TIENE QUE HACER
									//Window.alert("ATENCION: <br> vamos a intentar acceder a los tags que aun no estÁn disponibles por eso no me selecciona las fotos correspondientes");
									jsonProcess(response.getText());
									db.setText(checkControl);
									
									
								} else {
									checkControl+="bad photo request"+response.getStatusCode();
									db.setText(checkControl);
								
								}
							}
						});
			} catch (RequestException e) {
				// Couldn't connect to server
				
				
			}

		}

	}
	public void jsonProcess(String text){
		
		// Index of ("{")
		int index=text.indexOf("{");	
		
		//String built
		
		String substringJSON=text.substring(index);
		
		//para probar
		System.out.println("el JSON obtenido es :\n"+substringJSON);
		
		checkControl+=substringJSON;
		db.setText(checkControl);
		//Window.alert(substringJSON);
		
		JSONValue jsonValue=JSONParser.parse(substringJSON);  // Parser to JSON
		JSONObject jsonObject=jsonValue.isObject();			  //Parser to Object
		JSONValue takePhotos=jsonObject.get("photos");	//JSONValue
		JSONArray jsonArray=takePhotos.isArray();	// Parser to JSONArray
		
		if(jsonArray!=null){
		
			
			//Number of photos in the array
			Integer photoNumber2=jsonArray.size();
			//Window.alert(photoNumber2.toString());
			
			checkControl+="number of photos"+ photoNumber2.toString();
			db.setText(checkControl);
//			VerticalPanel photoPannel=new VerticalPanel();
//			mainPanel.add(photoPannel);
			
			
			List<Photo> photoPoints=new LinkedList<Photo>();
			
			for(int i=0;i<photoNumber2;i++){
				JSONValue photoValue=jsonArray.get(i);
				JSONObject photoi=photoValue.isObject();
				
				Photo ph=createPhotosFromJSON(photoi);
				
						photoPoints.add(ph);
//						for(Photo p:photoPoints){
//							//System.out.println("photo name es: "+p.getPhotoName());
//						}


			}
			//Window.alert("I found the points");
			checkControl+="i already have photos";
			db.setText(checkControl);
			
			//We choose the algorithm
			
			//algorithm=new AlgorithmOne();
			
			AlgorithmFactory af=AlgorithmFactory.getSingleInstance();
			algorithm=af.createAlgorithm(algorithms.getSelectedIndex());
				
			Integer selectedMinNumberPhotos=selectedMinPhotosPerArea();
				
			Double radio=selectedRadio();
			System.out.println("El radio seleccionado es: "+radio);
				
				// Estas areas estan ordenadas con respecto a:
					// popularidad -> si algorithmone
					// numero de fotos que CONTIENEN -> si algorithmtwo
					// triángulos pequeños -> si algoritmothree
				List<Area> interestingAreas=algorithm.interestingAreas(photoPoints,radio,map.getBounds());
				checkControl+="The interesting areas are:"+interestingAreas.toString();
				db.setText(checkControl);
				
				//Adiero al panel root el panel para las fotos, ahora si me interesa que aparezca
				RootPanel.get("phototour").add(photoPanel);
				Integer maxAreas=selectedMaxAreas();
				Integer añadidas=0;
				for(int i=0;i<interestingAreas.size()&&añadidas<maxAreas;i++){
					//Aquí controlo si tiene el mínimo de fotos requerido para ser representada
					if(interestingAreas.get(i).getPhotos().size()>=selectedMinNumberPhotos){
						areaAndImage=new HorizontalPanel();
						areaAndImage.setStyleName("complete-area");
					
						//Name of the Area (popularity)
						Label areaName=new Label("Area"+i);
//						areaAndImage.add(areaName);
						
						//Lista de fotos a mostrar
						List<Photo> photosAreai=new LinkedList<Photo>();
						photosAreai.addAll(interestingAreas.get(i).getPhotos());
						
						
						for(int j=0;j<4&&j<photosAreai.size();j++){
							Photo photo=photosAreai.get(j);
							
							// Image creation TODO : CAMBIARLA A /small....
							
							String photoUrl=photo.getUrl_ubication();
							Image asociatedImage=new Image(photoUrl);
							asociatedImage.setStyleName("image");
						
						
							// Name
							String photoN=photo.getPhotoName();
							Label photoName=new Label(photoN);
							photoName.setStyleName("photo-name");
							
							// HiperLink Creation
							
							String photoHyperlink=photo.getHyperlink();
							Anchor hyperlink= new Anchor(photoHyperlink,photoHyperlink);
							
							// Number of photos Creation
							Label totalPhotos=new Label(" Contains "+interestingAreas.get(i).getPhotos().size()+" photos ");
														
							
							System.out.println("Añado un area, tiene "+interestingAreas.get(i).getPhotos().size()+"más o igual de "+selectedMinNumberPhotos+" imágenes. ");
							añadidas++;
							
							if(j==0){
								areaAndImage.add(photoName);
							}
							areaAndImage.add(asociatedImage);
//							areaAndImage.add(totalPhotos);
//							areaAndImage.add(hyperlink);
							
							
						}
						Photo principalPhoto=interestingAreas.get(i).getPrincipalPhoto();

						String principalPhotoUrl=principalPhoto.getUrl_ubication();
						
						//Representation map
					
						Double latitudeOfTheMainPhoto=principalPhoto.getLatitude();
						Double longitudeOfTheMainPhoto=principalPhoto.getLongitude();
						representationMap(latitudeOfTheMainPhoto,longitudeOfTheMainPhoto,principalPhotoUrl,i);
					
						
						
						photoPanel.add(areaAndImage);
				}else
					//No puedo borrar areas de la lista pq sino puede que el 'i' se haga mayor que su tamaño 
					//aunque sigan quedando areas: p.e i=10, size=11 borro un area que era la de la 
					//posición 10
					System.out.println("No añado el area "+i+" porque contiene menos de: "+selectedMinNumberPhotos+" tiene "+interestingAreas.get(i).getPhotos().size()+" fotos.");
				}
				System.out.println("Filtrando por el mínimo de fotos por area quedan: "+interestingAreas.size()+" áreas. ");
			}else
				throw new JSONException();
		

			//TODO
//			options.setGeodesic(true);
//			LatLng [] pepe={LatLng.newInstance(-6.0, 37.0),LatLng.newInstance(-5.5, 37.002)};
//			Polyline polyline=new Polyline(pepe, "#FF00FF", 1, 1.0,
//				PolylineOptions.newInstance(true));
//        
//			map.addOverlay(polyline);
//			Window.alert("tenemos"+mapsPoints.length+"puntos a representar");
	}
	
	
	public Photo createPhotosFromJSON(JSONObject photoi){
				
				// Latitude Parameter
		
				JSONValue latitudValue=photoi.get("latitude");
				JSONNumber jsonLat=latitudValue.isNumber();
				Double latitude=jsonLat.doubleValue();
				
				//Longitude Parameter
				
				JSONValue longitudeValue=photoi.get("longitude");
				JSONNumber jsonLong=longitudeValue.isNumber();
				Double longitude=jsonLong.doubleValue();
				
				//Photo name
				
				JSONValue valueName=photoi.get("photo_title");
				JSONString jsonName=valueName.isString();
				String name=jsonName.stringValue();

				
				//Photo URL
				
				JSONValue valueUrl=photoi.get("photo_file_url");
				JSONString jsonUrl=valueUrl.isString();
				String url=jsonUrl.stringValue();
				
				//Photo Hyperlink
				
				JSONValue valueHyperlink=photoi.get("photo_url");
				JSONString jsonHyperlink=valueHyperlink.isString();
				String hyperlink=jsonHyperlink.stringValue();
				
				
				Photo photoPointi=new Photo(latitude,longitude,name,url,hyperlink,new LinkedList<String>());
				
				//Lo que hago aquí es rellenar las etiquetas de la foto en cuestion
				//photoPointi.setTags("tag");
				return photoPointi;
	}


	public Algorithm getAlgorithm() {
		return algorithm;
	}


	public void setAlgorithmsStrategy(Algorithm algorithmsStrategy) {
		this.algorithm = algorithmsStrategy;
	}
	
	public void representationMap(Double latitude,Double longitude,String imageUrl,Integer numeroArea){//TODO
		
		
		//la latitud y la longitud que queremos representar son las de cada una de las fotos
		//principales de las areas de interés halladas y devueltas por pantalla
		//de modo que este metodo tiene que llamarse dentro del que se procesan cada una de
		//las areas(y se muestran sus fotos)
		Icon icon=Icon.newInstance("http://labs.google.com/ridefinder/images/mm_20_red.png");
		MarkerOptions markerOption=MarkerOptions.newInstance(icon);
		
		//necesito meter dentro de el marcador el titulo de la imagen porque en el manejador 
		//no puedo usar parametros,solo el contenido de los atributos del marcador(que es el sendler)
		markerOption.setTitle(imageUrl);
		LatLng ubicacionPhotoi=LatLng.newInstance(latitude, longitude);
		Marker m=new Marker(ubicacionPhotoi,markerOption);
		//InfoWindowContent iw=new InfoWindowContent(new Image("http://labs.google.com/ridefinder/images/mm_20_red.png",2,2,2,2));
		
		
		m.addMarkerClickHandler(new MarkerClickHandler(){
			public void onClick(MarkerClickEvent event) {
				Image i=new Image(event.getSender().getTitle());
				i.setStyleName("tab-image");
//				i.setSize("20em", "20em");
				InfoWindowTab i1=new InfoWindowTab("imagen", i);
				Anchor hyp= new Anchor(event.getSender().getTitle(), event.getSender().getTitle());
				InfoWindowTab i2=new InfoWindowTab("Información:",hyp);
				//creo pestañas con la imagen principal y con lo que sea que quiera añadir tambien
				InfoWindowTab [] it={i1,i2};
				
				//asocio a la ventana la pestaña, y digo que la 0 será la pcipal
				InfoWindowContent iwc=new InfoWindowContent(it,0);
				
				
				map.getInfoWindow().open(event.getSender().getLatLng(),iwc);
				//una vez pulsado le cambio el color al marcador
				event.getSender().setImage("mm_20_purple.png");
			}
			
		});
		map.addOverlay(m);
		
		//map.addOverlay(overlayLineas);
		
		mapsPoints[numeroArea]=ubicacionPhotoi;	//voy rellenando el array
//		PolylineOptions options=PolylineOptions.newInstance();
//		options.setGeodesic(true);
//        
//        Polyline polyline=new Polyline(mapsPoints, "#00FFFF", 2, 4,
//        	       options);
//        
//        map.addOverlay(polyline);
		
		
		
	}	

	
/*____Mètodos para obtener el parámetro oportuno___________________________________________*/
	/**1*/
	public Integer selectedNumberOfPhotos(){
		Integer selected=100;
		String numb=numberOfPhotosT.getText();
		if(numb==null||numb.equals("")){
			Integer sI=numberOfPhotos.getSelectedIndex();
			if(sI.equals(-1) || sI==null){
				Window.alert("Debió seleccionar el número de fotos a solicitar, se solicitarán 100 fotos");
			}else{//CASO FAVORABLE LB
				numb=numberOfPhotos.getItemText(sI);
				selected=Integer.parseInt(numb);
			}
		}else{//CASO FAVORABLE TB
			selected=Integer.parseInt(numb);
			//selected=serverValidationNumberOfPhotos(selected);	//devolverá -1 si no vale
		}
		return selected;
	}
	/**2*/
	public Double selectedRadio(){
		Double selected=0.0025;
		String numb=distanceAlgorithmT.getText();
		if((numb.equals(null))||(numb.equals(""))){
			Integer sI=distanceAlgorithm.getSelectedIndex();
			if(sI.equals(-1) || sI==null){
				Window.alert("Debió seleccionar el radio a utilizar, se le asignará un radio de 0.0025");
			}else{//CASO FAVORABLE LB
				numb=distanceAlgorithm.getItemText(sI);
				selected=Double.parseDouble(numb);
			}
		}else{//CASO FAVORABLE TB
			selected=Double.parseDouble(numb);
			//selected=serverValidationRadio(selected);	//devolverá -1.0 si no vale
		}
		return selected;
	}
	/**3*/
	public Integer selectedMinPhotosPerArea(){
		Integer selected=1;
		String numb=minimunPhotosT.getText();
		if(numb==null||numb.equals("")){
			Integer sI=minimunPhotos.getSelectedIndex();
			System.out.println("En minimunPhotos se ha marcado la opción "+sI);
			if(sI.equals(-1) || sI==null){
				Window.alert("Debió seleccionar el número mínimo de fotos por área, se le asignará un mínimo de 1");
			}else{//CASO FAVORABLE LB
				numb=minimunPhotos.getItemText(sI);
				selected=Integer.parseInt(numb);
			}
		}else{//CASO FAVORABLE TB
			selected=Integer.parseInt(numb);
			//selected=serverValidationMinimunPhotos(selected);	//devolverá -1 si no vale
		}
		return selected;
	}
	/**4*/
	public Integer selectedMaxAreas(){
		Integer selected=10;
		String numb=maximunAreasT.getText();
		if(numb==null||numb.equals("")){
			Integer sI=maximunAreas.getSelectedIndex();
			if(sI.equals(-1) || sI==null){
				Window.alert("Debió seleccionar el máximo de áreas, se le asignará un valor de 10");
			}else{//CASO FAVORABLE LB
				numb=maximunAreas.getItemText(sI);
				selected=Integer.parseInt(numb);
			}
		}else{//CASO FAVORABLE TB
			selected=Integer.parseInt(numb);
			//selected=serverValidationMaxAreas(selected);	//devolverá -1 si no vale
		}
		return selected;
	}
	
	
/*____Metodos que rellenan los listBox de los parámetros en estudio________________________*/
	/**0*/
	public void fillAlgorithms(){
		algorithms.addItem("A2:medium-sized areas and central photo");
		algorithms.addItem("A1:small areas and most popular photo");
		algorithms.addItem("A3:use Delaunay Triangulation to get areas");
	}
	/**1*/
	public void fillRadius(){
		Integer zoom=map.getZoomLevel();
		System.out.println("El zoom es: "+zoom);
		if(zoom<15){
			if(zoom<=13){
				//zoom >=ANDALUCÍA (coge del )
				if(zoom<=7){
					distanceAlgorithm.addItem("0.015");
					distanceAlgorithm.addItem("0.036 ");
					distanceAlgorithm.addItem("0.058 ");
					distanceAlgorithm.addItem("0.079");
					distanceAlgorithm.addItem("0.1");
				}else{//zoom >=SEVILLA y <ANDALUCÍA (coge del 8 al 13)
					distanceAlgorithm.addItem("0.0015");
					distanceAlgorithm.addItem("0.0059");
					distanceAlgorithm.addItem("0.0118");
					distanceAlgorithm.addItem("0.0176");
					distanceAlgorithm.addItem("0.025");
				}
			}else{//zoom es 14 o mayor >=CARMONA y <SEVILLA
				distanceAlgorithm.addItem("0.0015");
				distanceAlgorithm.addItem("0.0021");
				distanceAlgorithm.addItem("0.0028");
				distanceAlgorithm.addItem("0.0034");
				distanceAlgorithm.addItem("0.004");
				
			}
		}
	}
	/**2*/
	public void fillNumberOfPhotos(){
		numberOfPhotos.addItem("50");
		numberOfPhotos.addItem("68");
		numberOfPhotos.addItem("85");
		numberOfPhotos.addItem("103");
		numberOfPhotos.addItem("120");
	}
	/**3*/
	public void fillMinPhotosPerArea(){
		Double radio=selectedRadio();
		if(radio==-1 || radio.equals(null)){
			Window.alert("You have to select the radio of the area before");
		}else{
			Integer zoom=map.getZoomLevel();
			if(zoom>=14){
			minimunPhotos.addItem("1");
			minimunPhotos.addItem("4");
			minimunPhotos.addItem("7");
			minimunPhotos.addItem("11");
			minimunPhotos.addItem("15");

		}else{

			if(radio<=0.05){
				minimunPhotos.addItem("1");
				minimunPhotos.addItem("6");
				minimunPhotos.addItem("11");
				minimunPhotos.addItem("15");
				minimunPhotos.addItem("20");
			}else{
				minimunPhotos.addItem("1");
				minimunPhotos.addItem("8");
				minimunPhotos.addItem("15");
				minimunPhotos.addItem("23");
				minimunPhotos.addItem("30");
			}
		}
		}
	}
	/**4*/
	public void fillMaxAreas(){
		Integer zoom=map.getZoomLevel();
		
			if(zoom<14){
				
				if(zoom<=7){//zoom >=ANDALUCÍA
					maximunAreas.addItem("5");
					maximunAreas.addItem("11");
					maximunAreas.addItem("18");
					maximunAreas.addItem("24");
					maximunAreas.addItem("30");
				}else{//zoom >=SEVILLA , >ANDALUCÍA y <CARMONA
					maximunAreas.addItem("1");
					maximunAreas.addItem(" 6");
					maximunAreas.addItem("11 ");
					maximunAreas.addItem("15");
					maximunAreas.addItem("20");
				}
			}else{//zoom >=CARMONA y <SEVILLA
				maximunAreas.addItem("1");
				maximunAreas.addItem("3");
				maximunAreas.addItem("5");
				maximunAreas.addItem("8");
				maximunAreas.addItem("10");
				
			}
		
	}
	//estructura validación
//	Pattern p = Pattern.compile("^[0-9].[0-9]{2,6}");
//    Matcher m = p.matcher(distanceS);
//    if (!m.find()){
//    	Window.alert("La distancia introducida tiene que ser del formato: x.xxxxxx");
//	}else{
		
}